Activation function characteristics

Plots showing activation function behaviour of different biological interactions.

1 Activation functions

In the case where A activates or inhibits B, the rate equations are shown below which are equal to the activation equations due to the parameter choices.

2 OR based interactions with the SAME act/inhib effect

Interactions covered here are those where both the regulators have the same activation behaviour, that is either both are activators or both are inhibitors. Each regulator complements the other.

The case of independent OR inhibitions (right figures) looks more like the scenario where A and B inhibit C with dependence.

3 AND based interactions with the SAME act/inhib effect

Interactions covered here are those where both the regulators have the same activation behaviour, that is either both are activators or both are inhibitors. Both regulators work together therefore are independent.

The case of independent OR inhibitions (right figures) looks more like the scenario where A or B inhibit C with independence.

4 Interactions with the DIFFERENT act/inhib effect

Interactions covered here are those where both the regulators have the DIFFERENT activation behaviour, that is one is an activator while the other an inhibitor.

The case of dependent regulators (right figures) looks more like the scenario where A activates C but B sequesters this regulation.

The case of independent regulators (left figures) looks more like the scenario where B activates C but A dominantly activates C. I am sure whether this kind of regulatory relations exist in biology.

5 OR with different act/inhib effect further investigation

Lac operon regulation

Lac operon regulation

6 Generalization of complex regulatory behaviour

A represses C with the corepressor L. X inhibits this repression.

x-axis is L

y-axis is X

7 Conditional dependence

Input models setting

Error: unexpected symbol in:
"              choices = c(0.2, 0.4, 0.5), selected = 0.2)
  selectInput"
LS0tDQp0aXRsZTogIkFjdGl2YXRpb24gZnVuY3Rpb24gY2hhcmFjdGVyaXN0aWNzIg0KcnVudGltZTogc2hpbnkNCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCi0tLQ0KDQpQbG90cyBzaG93aW5nIGFjdGl2YXRpb24gZnVuY3Rpb24gYmVoYXZpb3VyIG9mIGRpZmZlcmVudCBiaW9sb2dpY2FsIGludGVyYWN0aW9ucy4NCg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnNvdXJjZSgnLi4vR3JhcGhHUk4tbWV0aG9kcy5SJykNCnNvdXJjZSgnLi4vR3JhcGhHUk4uUicpDQpzb3VyY2UoJy4uL1NpbXVsYXRpb25HUk4tbWV0aG9kcy5SJykNCnNvdXJjZSgnLi4vU2ltdWxhdGlvbkdSTi5SJykNCnNvdXJjZSgnYW5hbHlzaXNfbWV0aG9kcy5SJykNCmxpYnJhcnkoaWdyYXBoKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGdyaWQpDQpsaWJyYXJ5KGdncmFwaCkNCmxpYnJhcnkoZGVTb2x2ZSkNCmxpYnJhcnkoZm9yZWFjaCkNCmxpYnJhcnkobmxlcXNsdikNCmxpYnJhcnkobWNsdXN0KQ0KbGlicmFyeShzaGlueSkNCg0KI2FjdGl2YXRpb24gZnVuY3Rpb24NCmZBY3QgPC0gZnVuY3Rpb24oVEYsIEVDNTAgPSAwLjUsIG4gPSAxLjM5KSB7DQogIEIgPSAoRUM1MCBeIG4gLSAxKSAvICgyICogRUM1MCBeIG4gLSAxKQ0KICBLX24gPSAoQiAtIDEpDQogIGFjdCA9IEIgKiBURiBeIG4gLyAoS19uICsgVEYgXiBuKQ0KICANCiAgcmV0dXJuKGFjdCkNCn0NCg0KI211bHRpcGxvdCBmdW5jdGlvbg0KbXVsdGlwbG90IDwtIGZ1bmN0aW9uKC4uLiwgcGxvdGxpc3Q9TlVMTCwgZmlsZSwgY29scz0xLCBsYXlvdXQ9TlVMTCkgew0KCQ0KCSMgTWFrZSBhIGxpc3QgZnJvbSB0aGUgLi4uIGFyZ3VtZW50cyBhbmQgcGxvdGxpc3QNCglwbG90cyA8LSBjKGxpc3QoLi4uKSwgcGxvdGxpc3QpDQoJDQoJbnVtUGxvdHMgPSBsZW5ndGgocGxvdHMpDQoJDQoJIyBJZiBsYXlvdXQgaXMgTlVMTCwgdGhlbiB1c2UgJ2NvbHMnIHRvIGRldGVybWluZSBsYXlvdXQNCglpZiAoaXMubnVsbChsYXlvdXQpKSB7DQoJCSMgTWFrZSB0aGUgcGFuZWwNCgkJIyBuY29sOiBOdW1iZXIgb2YgY29sdW1ucyBvZiBwbG90cw0KCQkjIG5yb3c6IE51bWJlciBvZiByb3dzIG5lZWRlZCwgY2FsY3VsYXRlZCBmcm9tICMgb2YgY29scw0KCQlsYXlvdXQgPC0gbWF0cml4KHNlcSgxLCBjb2xzICogY2VpbGluZyhudW1QbG90cy9jb2xzKSksDQoJCQkJCQkgbmNvbCA9IGNvbHMsIG5yb3cgPSBjZWlsaW5nKG51bVBsb3RzL2NvbHMpKQ0KCX0NCgkNCglpZiAobnVtUGxvdHM9PTEpIHsNCgkJcHJpbnQocGxvdHNbWzFdXSkNCgkJDQoJfSBlbHNlIHsNCgkJIyBTZXQgdXAgdGhlIHBhZ2UNCgkJZ3JpZC5uZXdwYWdlKCkNCgkJcHVzaFZpZXdwb3J0KHZpZXdwb3J0KGxheW91dCA9IGdyaWQubGF5b3V0KG5yb3cobGF5b3V0KSwgbmNvbChsYXlvdXQpKSkpDQoJCQ0KCQkjIE1ha2UgZWFjaCBwbG90LCBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbg0KCQlmb3IgKGkgaW4gMTpudW1QbG90cykgew0KCQkJIyBHZXQgdGhlIGksaiBtYXRyaXggcG9zaXRpb25zIG9mIHRoZSByZWdpb25zIHRoYXQgY29udGFpbiB0aGlzIHN1YnBsb3QNCgkJCW1hdGNoaWR4IDwtIGFzLmRhdGEuZnJhbWUod2hpY2gobGF5b3V0ID09IGksIGFyci5pbmQgPSBUUlVFKSkNCgkJCQ0KCQkJcHJpbnQocGxvdHNbW2ldXSwgdnAgPSB2aWV3cG9ydChsYXlvdXQucG9zLnJvdyA9IG1hdGNoaWR4JHJvdywNCgkJCQkJCQkJCQkJbGF5b3V0LnBvcy5jb2wgPSBtYXRjaGlkeCRjb2wpKQ0KCQl9DQoJfQ0KfQ0KDQpuc2l6ZSA9IDQwDQpgYGANCg0KI0FjdGl2YXRpb24gZnVuY3Rpb25zDQpJbiB0aGUgY2FzZSB3aGVyZSAqKkEqKiBhY3RpdmF0ZXMgb3IgaW5oaWJpdHMgKipCKiosIHRoZSByYXRlIGVxdWF0aW9ucyBhcmUgc2hvd24NCmJlbG93IHdoaWNoIGFyZSBlcXVhbCB0byB0aGUgYWN0aXZhdGlvbiBlcXVhdGlvbnMgZHVlIHRvIHRoZSBwYXJhbWV0ZXIgY2hvaWNlcy4NCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojYWN0aXZhdGlvbiBmdW5jdGlvbiBwbG90cw0KZiA9IGZ1bmN0aW9uKEEsIHJhdGVlcW4pIHsNCiAgQiA9IDANCiAgZXZhbChwYXJzZSh0ZXh0ID0gcmF0ZWVxbikpDQp9DQpBID0gc2VxKDAsIDEsIGxlbmd0aC5vdXQgPSAxMDApDQoNCiNBLT5CDQpnYWN0ID0gbmV3KCdHcmFwaEdSTicpDQpnYWN0ID0gYWRkTm9kZShnYWN0LCAnQScpDQpnYWN0ID0gYWRkTm9kZShnYWN0LCAnQicpDQpnYWN0ID0gYWRkRWRnZShnYWN0LCAnQScsICdCJywgYWN0aXZhdGlvbiA9IFQpDQphY3RlcW4gPSBnZW5lcmF0ZVJhdGVFcW4oZ2V0Tm9kZShnYWN0LCAnQicpLCBnYWN0KQ0KQiA9IGYoQSwgYWN0ZXFuKQ0KcGxvdChBLCBCLCBjb2wgPSAzLCB0eXBlID0gJ2wnLCBtYWluID0gJ0Egc2luZ2xlIGFjdGl2YXRpb24gZnVuY3Rpb24nKQ0KDQojQS0+Qg0KZ2luYiA9IG5ldygnR3JhcGhHUk4nKQ0KZ2luYiA9IGFkZE5vZGUoZ2luYiwgJ0EnKQ0KZ2luYiA9IGFkZE5vZGUoZ2luYiwgJ0InKQ0KZ2luYiA9IGFkZEVkZ2UoZ2luYiwgJ0EnLCAnQicsIGFjdGl2YXRpb24gPSBGKQ0KaW5iZXFuID0gZ2VuZXJhdGVSYXRlRXFuKGdldE5vZGUoZ2luYiwgJ0InKSwgZ2luYikNCkIgPSBmKEEsIGluYmVxbikNCnBhcihuZXcgPSBUKQ0KcGxvdChBLCBCLCBjb2wgPSAyLCB0eXBlID0gJ2wnKQ0KcGFyKG5ldyA9IEYpDQpgYGANCg0KDQojT1IgYmFzZWQgaW50ZXJhY3Rpb25zIHdpdGggdGhlIFNBTUUgYWN0L2luaGliIGVmZmVjdA0KSW50ZXJhY3Rpb25zIGNvdmVyZWQgaGVyZSBhcmUgdGhvc2Ugd2hlcmUgYm90aCB0aGUgcmVndWxhdG9ycyBoYXZlIHRoZSBzYW1lDQphY3RpdmF0aW9uIGJlaGF2aW91ciwgdGhhdCBpcyBlaXRoZXIgYm90aCBhcmUgYWN0aXZhdG9ycyBvciBib3RoIGFyZSBpbmhpYml0b3JzLg0KRWFjaCByZWd1bGF0b3IgY29tcGxlbWVudHMgdGhlIG90aGVyLg0KDQpUaGUgY2FzZSBvZiBpbmRlcGVuZGVudCBPUiBpbmhpYml0aW9ucyAocmlnaHQgZmlndXJlcykgbG9va3MgbW9yZSBsaWtlIHRoZQ0Kc2NlbmFyaW8gd2hlcmUgKipBIGFuZCBCKiogaW5oaWJpdCBDIHdpdGggZGVwZW5kZW5jZS4NCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQppZ3JhcGhfb3B0aW9ucyhwbG90LmxheW91dD1sYXlvdXRfaW5fY2lyY2xlKQ0KcGFyKG1mcm93ID0gYygxLCAyKSkNCmNvbG1hcCA9IGMoJ1RSVUUnID0gJ2dyZWVuJywgJ0ZBTFNFJyA9ICdyZWQnKQ0KDQojMiBhY3RpdmF0b3JzDQpnYWN0ID0gbmV3KCdHcmFwaEdSTicpDQpmb3IgKG4gaW4gTEVUVEVSU1sxOjNdKSB7DQogIGdhY3QgPSBhZGROb2RlKGdhY3QsIG4pDQp9DQpnYWN0ID0gYWRkRWRnZShnYWN0LCAnQScsICdDJywgYWN0aXZhdGlvbiA9IFQpDQpnYWN0ID0gYWRkRWRnZShnYWN0LCAnQicsICdDJywgYWN0aXZhdGlvbiA9IFQpDQoNCmdkZiA9IEdyYXBoR1JOMmRmKGdhY3QpDQppZyA9IGdyYXBoX2Zyb21fZGF0YV9mcmFtZShnZGYkZWRnZXMsIGRpcmVjdGVkID0gVCwgZ2RmJG5vZGVzKQ0KRShpZykkY29sb3IgPSBjb2xtYXBbYXMuY2hhcmFjdGVyKEUoaWcpJHR5cGUpXQ0KcGxvdChpZywgdmVydGV4LnNpemUgPSBuc2l6ZSwgbWFpbiA9ICcyIGluZGVwZW5kZW50IGFjdGl2YXRvcnMnKQ0KDQojMiBpbmhpYml0b3JzDQpnaW5iID0gbmV3KCdHcmFwaEdSTicpDQpmb3IgKG4gaW4gTEVUVEVSU1sxOjNdKSB7DQogIGdpbmIgPSBhZGROb2RlKGdpbmIsIG4pDQp9DQpnaW5iID0gYWRkRWRnZShnaW5iLCAnQScsICdDJywgYWN0aXZhdGlvbiA9IEYpDQpnaW5iID0gYWRkRWRnZShnaW5iLCAnQicsICdDJywgYWN0aXZhdGlvbiA9IEYpDQoNCmdkZiA9IEdyYXBoR1JOMmRmKGdpbmIpDQppZyA9IGdyYXBoX2Zyb21fZGF0YV9mcmFtZShnZGYkZWRnZXMsIGRpcmVjdGVkID0gVCwgZ2RmJG5vZGVzKQ0KRShpZykkY29sb3IgPSBjb2xtYXBbYXMuY2hhcmFjdGVyKEUoaWcpJHR5cGUpXQ0KcGxvdChpZywgdmVydGV4LnNpemUgPSBuc2l6ZSwgbWFpbiA9ICcyIGluZGVwZW5kZW50IGluaGliaXRvcnMnKQ0KDQojYWN0aXZhdGlvbiBmdW5jdGlvbiBwbG90cw0KZiA9IGZ1bmN0aW9uKEEsIEIsIHJhdGVlcW4pIHsNCiAgQyA9IDANCiAgZXZhbChwYXJzZSh0ZXh0ID0gcmF0ZWVxbikpDQp9DQoNCmFjdGVxbiA9IGdlbmVyYXRlUmF0ZUVxbihnZXROb2RlKGdhY3QsICdDJyksIGdhY3QpDQppbmJlcW4gPSBnZW5lcmF0ZVJhdGVFcW4oZ2V0Tm9kZShnaW5iLCAnQycpLCBnaW5iKQ0KDQojcGxvdCBhY3RpdmF0aW9uIGZ1bmN0aW9ucw0KcGRhdGEgPSBleHBhbmQuZ3JpZCgnQScgPSBzZXEoMCwgMSwgbGVuZ3RoLm91dCA9IDEwMCksICdCJyA9IHNlcSgwLCAxLCBsZW5ndGgub3V0ID0gMTAwKSkNCnBkYXRhWydBY3RpdmF0aW9uJ10gPSBmKHBkYXRhJEEsIHBkYXRhJEIsIGFjdGVxbikNCnAxID0gZ2dwbG90KHBkYXRhLCBhZXMoQSwgQiwgZmlsbCA9IEFjdGl2YXRpb24pKSArDQogIGdlb21fcmFzdGVyKCkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gJ1lsT3JSZCcsIGRpcmVjdGlvbiA9IDEpICsNCiAgZ2d0aXRsZSgnMiBpbmRlcGVuZGVudCBhY3RpdmF0b3JzJykgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KcGRhdGFbJ0FjdGl2YXRpb24nXSA9IGYocGRhdGEkQSwgcGRhdGEkQiwgaW5iZXFuKQ0KcDIgPSBnZ3Bsb3QocGRhdGEsIGFlcyhBLCBCLCBmaWxsID0gQWN0aXZhdGlvbikpICsNCiAgZ2VvbV9yYXN0ZXIoKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAnWWxPclJkJywgZGlyZWN0aW9uID0gMSkgKw0KICBnZ3RpdGxlKCcyIGluZGVwZW5kZW50IGluaGliaXRvcnMnKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQ0KICApDQoNCm11bHRpcGxvdChwMSwgcDIsIGNvbHMgPSAyKQ0KYGBgDQoNCiNBTkQgYmFzZWQgaW50ZXJhY3Rpb25zIHdpdGggdGhlIFNBTUUgYWN0L2luaGliIGVmZmVjdA0KSW50ZXJhY3Rpb25zIGNvdmVyZWQgaGVyZSBhcmUgdGhvc2Ugd2hlcmUgYm90aCB0aGUgcmVndWxhdG9ycyBoYXZlIHRoZSBzYW1lDQphY3RpdmF0aW9uIGJlaGF2aW91ciwgdGhhdCBpcyBlaXRoZXIgYm90aCBhcmUgYWN0aXZhdG9ycyBvciBib3RoIGFyZSBpbmhpYml0b3JzLg0KQm90aCByZWd1bGF0b3JzIHdvcmsgdG9nZXRoZXIgdGhlcmVmb3JlIGFyZSBpbmRlcGVuZGVudC4NCg0KVGhlIGNhc2Ugb2YgaW5kZXBlbmRlbnQgT1IgaW5oaWJpdGlvbnMgKHJpZ2h0IGZpZ3VyZXMpIGxvb2tzIG1vcmUgbGlrZSB0aGUNCnNjZW5hcmlvIHdoZXJlICoqQSBvciBCKiogaW5oaWJpdCBDIHdpdGggaW5kZXBlbmRlbmNlLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmlncmFwaF9vcHRpb25zKHBsb3QubGF5b3V0PWxheW91dF9hc19zdGFyKQ0KcGFyKG1mcm93ID0gYygxLCAyKSkNCmNvbG1hcCA9IGMoJ1RSVUUnID0gJ2dyZWVuJywgJ0ZBTFNFJyA9ICdyZWQnKQ0KDQojMiBhY3RpdmF0b3JzDQpnYWN0ID0gbmV3KCdHcmFwaEdSTicpDQpmb3IgKG4gaW4gTEVUVEVSU1sxOjNdKSB7DQogIGdhY3QgPSBhZGROb2RlKGdhY3QsIG4pDQp9DQpnYWN0ID0gYWRkRWRnZShnYWN0LCBjKCdBJywgJ0InKSwgJ0MnLCBlZGdldHlwZSA9ICdhbmQnLCBhY3RpdmF0aW9uID0gYyhULCBUKSkNCg0KZ2RmID0gR3JhcGhHUk4yZGYoZ2FjdCkNCmlnID0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGdkZiRlZGdlcywgZGlyZWN0ZWQgPSBULCBnZGYkbm9kZXMpDQpFKGlnKSRjb2xvciA9IGMoY29sbWFwW2FzLmNoYXJhY3RlcihFKGlnKSR0eXBlKVsxOjJdXSwgJ2RhcmtncmV5JykNCnBsb3QoaWcsIHZlcnRleC5zaXplID0gbnNpemUsIG1haW4gPSAnMiBkZXBlbmRlbnQgYWN0aXZhdG9ycycpDQoNCiMyIGluaGliaXRvcnMNCmdpbmIgPSBuZXcoJ0dyYXBoR1JOJykNCmZvciAobiBpbiBMRVRURVJTWzE6M10pIHsNCiAgZ2luYiA9IGFkZE5vZGUoZ2luYiwgbikNCn0NCmdpbmIgPSBhZGRFZGdlKGdpbmIsIGMoJ0EnLCAnQicpLCAnQycsIGVkZ2V0eXBlID0gJ2FuZCcsIGFjdGl2YXRpb24gPSBjKEYsIEYpKQ0KDQpnZGYgPSBHcmFwaEdSTjJkZihnaW5iKQ0KaWcgPSBncmFwaF9mcm9tX2RhdGFfZnJhbWUoZ2RmJGVkZ2VzLCBkaXJlY3RlZCA9IFQsIGdkZiRub2RlcykNCkUoaWcpJGNvbG9yID0gYyhjb2xtYXBbYXMuY2hhcmFjdGVyKEUoaWcpJHR5cGUpWzE6Ml1dLCAnZGFya2dyZXknKQ0KcGxvdChpZywgdmVydGV4LnNpemUgPSBuc2l6ZSwgbWFpbiA9ICcyIGRlcGVuZGVudCBpbmhpYml0b3JzJykNCg0KI2FjdGl2YXRpb24gZnVuY3Rpb24gcGxvdHMNCmYgPSBmdW5jdGlvbihBLCBCLCByYXRlZXFuKSB7DQogIEMgPSAwDQogIGV2YWwocGFyc2UodGV4dCA9IHJhdGVlcW4pKQ0KfQ0KDQphY3RlcW4gPSBnZW5lcmF0ZVJhdGVFcW4oZ2V0Tm9kZShnYWN0LCAnQycpLCBnYWN0KQ0KaW5iZXFuID0gZ2VuZXJhdGVSYXRlRXFuKGdldE5vZGUoZ2luYiwgJ0MnKSwgZ2luYikNCg0KI3Bsb3QgYWN0aXZhdGlvbiBmdW5jdGlvbnMNCnBkYXRhID0gZXhwYW5kLmdyaWQoJ0EnID0gc2VxKDAsIDEsIGxlbmd0aC5vdXQgPSAxMDApLCAnQicgPSBzZXEoMCwgMSwgbGVuZ3RoLm91dCA9IDEwMCkpDQpwZGF0YVsnQWN0aXZhdGlvbiddID0gZihwZGF0YSRBLCBwZGF0YSRCLCBhY3RlcW4pDQpwMSA9IGdncGxvdChwZGF0YSwgYWVzKEEsIEIsIGZpbGwgPSBBY3RpdmF0aW9uKSkgKw0KICBnZW9tX3Jhc3RlcigpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICdZbE9yUmQnLCBkaXJlY3Rpb24gPSAxKSArDQogIGdndGl0bGUoJzIgZGVwZW5kZW50IGFjdGl2YXRvcnMnKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQ0KICApDQpwZGF0YVsnQWN0aXZhdGlvbiddID0gZihwZGF0YSRBLCBwZGF0YSRCLCBpbmJlcW4pDQpwMiA9IGdncGxvdChwZGF0YSwgYWVzKEEsIEIsIGZpbGwgPSBBY3RpdmF0aW9uKSkgKw0KICBnZW9tX3Jhc3RlcigpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICdZbE9yUmQnLCBkaXJlY3Rpb24gPSAxKSArDQogIGdndGl0bGUoJzIgZGVwZW5kZW50IGluaGliaXRvcnMnKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQ0KICApDQoNCm11bHRpcGxvdChwMSwgcDIsIGNvbHMgPSAyKQ0KYGBgDQoNCiNJbnRlcmFjdGlvbnMgd2l0aCB0aGUgRElGRkVSRU5UIGFjdC9pbmhpYiBlZmZlY3QNCkludGVyYWN0aW9ucyBjb3ZlcmVkIGhlcmUgYXJlIHRob3NlIHdoZXJlIGJvdGggdGhlIHJlZ3VsYXRvcnMgaGF2ZSB0aGUgRElGRkVSRU5UDQphY3RpdmF0aW9uIGJlaGF2aW91ciwgdGhhdCBpcyBvbmUgaXMgYW4gYWN0aXZhdG9yIHdoaWxlIHRoZSBvdGhlciBhbiBpbmhpYml0b3IuDQoNClRoZSBjYXNlIG9mIGRlcGVuZGVudCByZWd1bGF0b3JzIChyaWdodCBmaWd1cmVzKSBsb29rcyBtb3JlIGxpa2UgdGhlDQpzY2VuYXJpbyB3aGVyZSAqKkEqKiBhY3RpdmF0ZXMgKipDKiogYnV0ICoqQioqIHNlcXVlc3RlcnMgdGhpcyByZWd1bGF0aW9uLg0KDQpUaGUgY2FzZSBvZiBpbmRlcGVuZGVudCByZWd1bGF0b3JzIChsZWZ0IGZpZ3VyZXMpIGxvb2tzIG1vcmUgbGlrZSB0aGUNCnNjZW5hcmlvIHdoZXJlICoqQioqIGFjdGl2YXRlcyAqKkMqKiBidXQgKipBKiogZG9taW5hbnRseSBhY3RpdmF0ZXMgKipDKiouIEkgYW0NCnN1cmUgd2hldGhlciB0aGlzIGtpbmQgb2YgcmVndWxhdG9yeSByZWxhdGlvbnMgZXhpc3QgaW4gYmlvbG9neS4NCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQppZ3JhcGhfb3B0aW9ucyhwbG90LmxheW91dD1sYXlvdXRfYXNfc3RhcikNCnBhcihtZnJvdyA9IGMoMSwgMikpDQpjb2xtYXAgPSBjKCdUUlVFJyA9ICdncmVlbicsICdGQUxTRScgPSAncmVkJykNCg0KIzEgYWN0aXZhdG9yIDEgaW5oaWJpdG9yIE9SDQpnb3IgPSBuZXcoJ0dyYXBoR1JOJykNCmZvciAobiBpbiBMRVRURVJTWzE6M10pIHsNCiAgZ29yID0gYWRkTm9kZShnb3IsIG4pDQp9DQpnb3IgPSBhZGRFZGdlKGdvciwgJ0EnLCAnQycsIGFjdGl2YXRpb24gPSBUKQ0KZ29yID0gYWRkRWRnZShnb3IsICdCJywgJ0MnLCBhY3RpdmF0aW9uID0gRikNCg0KZ2RmID0gR3JhcGhHUk4yZGYoZ29yKQ0KaWcgPSBncmFwaF9mcm9tX2RhdGFfZnJhbWUoZ2RmJGVkZ2VzLCBkaXJlY3RlZCA9IFQsIGdkZiRub2RlcykNCkUoaWcpJGNvbG9yID0gY29sbWFwW2FzLmNoYXJhY3RlcihFKGlnKSR0eXBlKV0NCnBsb3QoaWcsIHZlcnRleC5zaXplID0gbnNpemUsIG1haW4gPSAnMSBhY3QgMSBpbmhpYiBpbmRlcGVuZGVudCcpDQoNCiMxIGFjdGl2YXRvciAxIGluaGliaXRvciBBTkQNCmdhbmQgPSBuZXcoJ0dyYXBoR1JOJykNCmZvciAobiBpbiBMRVRURVJTWzE6M10pIHsNCiAgZ2FuZCA9IGFkZE5vZGUoZ2FuZCwgbikNCn0NCmdhbmQgPSBhZGRFZGdlKGdhbmQsIGMoJ0EnLCAnQicpLCAnQycsIGVkZ2V0eXBlID0gJ2FuZCcsIGFjdGl2YXRpb24gPSBjKFQsIEYpKQ0KDQpnZGYgPSBHcmFwaEdSTjJkZihnYW5kKQ0KaWcgPSBncmFwaF9mcm9tX2RhdGFfZnJhbWUoZ2RmJGVkZ2VzLCBkaXJlY3RlZCA9IFQsIGdkZiRub2RlcykNCkUoaWcpJGNvbG9yID0gYyhjb2xtYXBbYXMuY2hhcmFjdGVyKEUoaWcpJHR5cGUpWzE6Ml1dLCAnZGFya2dyZXknKQ0KcGxvdChpZywgdmVydGV4LnNpemUgPSBuc2l6ZSwgbWFpbiA9ICcxIGFjdCAxIGluaGliIGRlcGVuZGVudCcpDQoNCiNhY3RpdmF0aW9uIGZ1bmN0aW9uIHBsb3RzDQpmID0gZnVuY3Rpb24oQSwgQiwgcmF0ZWVxbikgew0KICBDID0gMA0KICBldmFsKHBhcnNlKHRleHQgPSByYXRlZXFuKSkNCn0NCg0Kb3JlcW4gPSBnZW5lcmF0ZVJhdGVFcW4oZ2V0Tm9kZShnb3IsICdDJyksIGdvcikNCmFuZGVxbiA9IGdlbmVyYXRlUmF0ZUVxbihnZXROb2RlKGdhbmQsICdDJyksIGdhbmQpDQoNCiNwbG90IGFjdGl2YXRpb24gZnVuY3Rpb25zDQpwZGF0YSA9IGV4cGFuZC5ncmlkKCdBJyA9IHNlcSgwLCAxLCBsZW5ndGgub3V0ID0gMTAwKSwgJ0InID0gc2VxKDAsIDEsIGxlbmd0aC5vdXQgPSAxMDApKQ0KcGRhdGFbJ0FjdGl2YXRpb24nXSA9IGYocGRhdGEkQSwgcGRhdGEkQiwgb3JlcW4pDQpwMSA9IGdncGxvdChwZGF0YSwgYWVzKEEsIEIsIGZpbGwgPSBBY3RpdmF0aW9uKSkgKw0KICBnZW9tX3Jhc3RlcigpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICdZbE9yUmQnLCBkaXJlY3Rpb24gPSAxKSArDQogIGdndGl0bGUoJzEgYWN0IDEgaW5oaWIgaW5kZXBlbmRlbnQnKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQ0KICApDQpwZGF0YVsnQWN0aXZhdGlvbiddID0gZihwZGF0YSRBLCBwZGF0YSRCLCBhbmRlcW4pDQpwMiA9IGdncGxvdChwZGF0YSwgYWVzKEEsIEIsIGZpbGwgPSBBY3RpdmF0aW9uKSkgKw0KICBnZW9tX3Jhc3RlcigpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICdZbE9yUmQnLCBkaXJlY3Rpb24gPSAxKSArDQogIGdndGl0bGUoJzEgYWN0IDEgaW5oaWIgZGVwZW5kZW50JykgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KDQptdWx0aXBsb3QocDEsIHAyLCBjb2xzID0gMikNCmBgYA0KDQojT1Igd2l0aCBkaWZmZXJlbnQgYWN0L2luaGliIGVmZmVjdCBmdXJ0aGVyIGludmVzdGlnYXRpb24NCg0KIVtMYWMgb3Blcm9uIHJlZ3VsYXRpb25dKGByIGZpbGUucGF0aChnZXR3ZCgpLCAnbGFjX29wZXJvbl9yZXByZXNzaW9uLlBORycpYCl7d2lkdGg9NzAlfQ0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmlncmFwaF9vcHRpb25zKHBsb3QubGF5b3V0PWxheW91dF9hc19zdGFyKQ0KcGFyKG1mcm93ID0gYygxLCAyKSkNCmNvbG1hcCA9IGMoJ1RSVUUnID0gJ2dyZWVuJywgJ0ZBTFNFJyA9ICdyZWQnKQ0KDQojMSBhY3RpdmF0b3IgMSBpbmhpYml0b3IgT1INCmdvciA9IG5ldygnR3JhcGhHUk4nKQ0KZm9yIChuIGluIGMoJ0xhY1JlcHJlc3NvcicsICdMYWNYWUEnLCAnbGFjdG9zZScpKSB7DQogIGdvciA9IGFkZE5vZGUoZ29yLCBuKQ0KfQ0KZ29yID0gYWRkRWRnZShnb3IsICdMYWNSZXByZXNzb3InLCAnTGFjWFlBJywgYWN0aXZhdGlvbiA9IEYpDQpnb3IgPSBhZGRFZGdlKGdvciwgJ2xhY3Rvc2UnLCAnTGFjWFlBJywgYWN0aXZhdGlvbiA9IFQpDQoNCmdkZiA9IEdyYXBoR1JOMmRmKGdvcikNCmlnID0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGdkZiRlZGdlcywgZGlyZWN0ZWQgPSBULCBnZGYkbm9kZXMpDQpFKGlnKSRjb2xvciA9IGNvbG1hcFthcy5jaGFyYWN0ZXIoRShpZykkdHlwZSldDQpwbG90KGlnLCB2ZXJ0ZXguc2l6ZSA9IG5zaXplLCBtYWluID0gJzEgYWN0IDEgaW5oaWIgaW5kZXBlbmRlbnQnKQ0KDQojYWN0aXZhdGlvbiBmdW5jdGlvbiBwbG90cw0KZiA9IGZ1bmN0aW9uKHQsIHN0YXRlLCBwYXJhbXMpIHsNCiAgd2l0aChhcy5saXN0KGMoc3RhdGUsIHBhcmFtcykpLCB7DQogICAgbGlzdCgnTGFjWFlBJyA9IGV2YWwocGFyc2UodGV4dCA9IGdlbmVyYXRlUmF0ZUVxbihnZXROb2RlKGdvciwgJ0xhY1hZQScpLCBnb3IpKSkpDQogIH0pDQp9DQoNCiNwbG90IExhY1hZQSB3aXRoIHZhcnlpbmcgYW1vdW50cyBvZiBsYWN0b3NlIGFuZCBmaXhlZCBMYWNSZXByZXNzb3INCnMwID0gYygnTGFjWFlBJyA9IDAuNSkNCnBhcm1zID0gYygnTGFjUmVwcmVzc29yJyA9IDAuNywgJ2xhY3Rvc2UnID0gMCkNCnRpbWVzID0gc2VxKDAsIDUsIGJ5ID0gMC4wMSkNCg0KcmVzID0gZm9yZWFjaCAoaSA9IHNlcSgwLCAxLCBieSA9IDAuMSksIC5wYWNrYWdlcyA9IGMoJ2RlU29sdmUnKSwgLmNvbWJpbmUgPSByYmluZCkgJWRvJSB7DQogIHBhcm1zWydsYWN0b3NlJ10gPSBpDQogIG91dCA9IG9kZSh5ID0gczAsIHRpbWVzID0gdGltZXMsIGZ1bmMgPSBmLCBwYXJtcyA9IHBhcm1zKVsgLCAyXQ0KICBvdXQgPSBjYmluZCgnTGFjWFlBJyA9IG91dCwgJ2xhY3Rvc2UnID0gaSwgJ3QnID0gdGltZXMpDQogIHJldHVybihvdXQpDQp9DQoNCnBkYXRhID0gYXMuZGF0YS5mcmFtZShyZXMpDQpjb2xtYXAgPSBjb2xvclJhbXBQYWxldHRlKGMoJ3llbGxvdycsICdvcmFuZ2UnLCAncmVkJykpKGxlbmd0aCh1bmlxdWUocmVzWywnbGFjdG9zZSddKSkpDQpuYW1lcyhjb2xtYXApID0gdW5pcXVlKHJlc1ssJ2xhY3Rvc2UnXSkNCnBkYXRhJGxhY3Rvc2UgPSBhcy5mYWN0b3IocGRhdGEkbGFjdG9zZSkNCg0KcDEgPSBnZ3Bsb3QocGRhdGEsIGFlcyh0LCBMYWNYWUEsIGNvbG91ciA9IGxhY3Rvc2UpKSArIGdlb21fbGluZShzaXplID0gMS4yKSsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjb2xtYXApICsNCiAgZ2d0aXRsZSgnTGFjUmVwcmVzc29yID0gMC43IChmaXhlZCksXG4gbGFjdG9zZSA9IFswLDFdJykNCg0KI3Bsb3QgTGFjWFlBIHdpdGggdmFyeWluZyBhbW91bnRzIG9mIExhY1JlcHJlc3NvciBhbmQgZml4ZWQgbGFjdG9zZQ0KczAgPSBjKCdMYWNYWUEnID0gMC41KQ0KcGFybXMgPSBjKCdMYWNSZXByZXNzb3InID0gMCwgJ2xhY3Rvc2UnID0gMC43KQ0KdGltZXMgPSBzZXEoMCwgNSwgYnkgPSAwLjAxKQ0KDQpyZXMgPSBmb3JlYWNoIChpID0gc2VxKDAsIDEsIGJ5ID0gMC4xKSwgLnBhY2thZ2VzID0gYygnZGVTb2x2ZScpLCAuY29tYmluZSA9IHJiaW5kKSAlZG8lIHsNCiAgcGFybXNbJ0xhY1JlcHJlc3NvciddID0gaQ0KICBvdXQgPSBvZGUoeSA9IHMwLCB0aW1lcyA9IHRpbWVzLCBmdW5jID0gZiwgcGFybXMgPSBwYXJtcylbICwgMl0NCiAgb3V0ID0gY2JpbmQoJ0xhY1hZQScgPSBvdXQsICdMYWNSZXByZXNzb3InID0gaSwgJ3QnID0gdGltZXMpDQogIHJldHVybihvdXQpDQp9DQoNCnBkYXRhID0gYXMuZGF0YS5mcmFtZShyZXMpDQpjb2xtYXAgPSBjb2xvclJhbXBQYWxldHRlKGMoJ3llbGxvdycsICdvcmFuZ2UnLCAncmVkJykpKGxlbmd0aCh1bmlxdWUocmVzWywnTGFjUmVwcmVzc29yJ10pKSkNCm5hbWVzKGNvbG1hcCkgPSB1bmlxdWUocmVzWywnTGFjUmVwcmVzc29yJ10pDQpwZGF0YSRMYWNSZXByZXNzb3IgPSBhcy5mYWN0b3IocGRhdGEkTGFjUmVwcmVzc29yKQ0KDQpwMiA9IGdncGxvdChwZGF0YSwgYWVzKHQsIExhY1hZQSwgY29sb3VyID0gTGFjUmVwcmVzc29yKSkgKyBnZW9tX2xpbmUoc2l6ZSA9IDEuMikrDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gY29sbWFwKSArDQogIGdndGl0bGUoJ0xhY1JlcHJlc3NvciA9IFswLDFdLFxuIGxhY3Rvc2UgPSAwLjcgKGZpeGVkKScpDQptdWx0aXBsb3QocDEsIHAyLCBjb2xzID0gMikNCmBgYA0KDQojR2VuZXJhbGl6YXRpb24gb2YgY29tcGxleCByZWd1bGF0b3J5IGJlaGF2aW91cg0KQSByZXByZXNzZXMgQyB3aXRoIHRoZSBjb3JlcHJlc3NvciBMLiBYIGluaGliaXRzIHRoaXMgcmVwcmVzc2lvbi4NCg0KeC1heGlzIGlzIEwNCg0KeS1heGlzIGlzIFgNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIzEgYWN0aXZhdG9yIDEgaW5oaWJpdG9yIE9SDQpnb3IgPSBuZXcoJ0dyYXBoR1JOJykNCmZvciAobiBpbiBjKCdBJywnQycsJ0wnLCdYJykpIHsNCiAgZ29yID0gYWRkTm9kZShnb3IsIG4pDQp9DQpnb3IgPSBhZGRFZGdlKGdvciwgJ0EnLCAnQycsIGFjdGl2YXRpb24gPSBGKQ0KZ29yID0gYWRkRWRnZShnb3IsICdYJywgJ0MnLCBhY3RpdmF0aW9uID0gVCkNCmdvciA9IGFkZEVkZ2UoZ29yLCAnTCcsICdDJywgYWN0aXZhdGlvbiA9IEYpDQoNCiNhY3RpdmF0aW9uIGZ1bmN0aW9uDQpmID0gZnVuY3Rpb24oQSwgTCwgWCkgew0KICBDID0gMA0KICBldmFsKHBhcnNlKHRleHQgPSBnZW5lcmF0ZVJhdGVFcW4oZ2V0Tm9kZShnb3IsICdDJyksIGdvcikpKQ0KfQ0KDQpBID0gc2VxKDAsIDEsIGJ5ID0gMC4wMSkNCkwgPSBzZXEoMCwgMSwgYnkgPSAwLjAxKQ0KWCA9IHNlcSgwLCAxLCBieSA9IDAuMDEpDQoNCkMgPSBmKEEsIEwsIFgpDQpobWRmID0gZXhwYW5kLmdyaWQoJ0wnID0gc2VxKDAsIDEsIGJ5ID0gMC4wMSksICdYJyA9IHNlcSgwLCAxLCBieSA9IDAuMDEpKQ0KaG1kZiRDID0gZigwLjEsIGhtZGYkTCwgaG1kZiRYKQ0KDQojcGxvdGx5IHNsaWRlcg0KYXZhbCA9IGxpc3QoKQ0KbnN0ZXBzID0gMTENCmZvciAoaSBpbiAxOm5zdGVwcyl7DQogIGhtZGYgPSBleHBhbmQuZ3JpZCgnTCcgPSBzZXEoMCwgMSwgYnkgPSAwLjAxKSwgJ1gnID0gc2VxKDAsIDEsIGJ5ID0gMC4wMSkpDQogIEEgPSBpL25zdGVwcw0KICBhdmFsW1tpXV0gPC1saXN0KHZpc2libGUgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gcm91bmQoQSwgZGlnaXRzID0gMiksDQogICAgICAgICAgICAgICAgICAgICAgeCA9IGhtZGYkTCwNCiAgICAgICAgICAgICAgICAgICAgICB5ID0gaG1kZiRYLA0KICAgICAgICAgICAgICAgICAgICAgIHogPSBmKEEsIGhtZGYkTCwgaG1kZiRYKSkNCiAgDQogIGF2YWxbaV1bWzFdXSR6WzFdID0gMA0KfQ0KYXZhbFsxXVtbMV1dJHZpc2libGUgPSBUUlVFDQoNCnN0ZXBzIDwtIGxpc3QoKQ0KcCA8LSBwbG90X2x5KHhheGlzID0gbGlzdCh0aXRsZSA9ICdMJyksIHlheGlzID0gbGlzdCh0aXRsZSA9ICdYJykpDQpmb3IgKGkgaW4gMTpuc3RlcHMpIHsNCiAgcCA9IGFkZF9oZWF0bWFwKHAseD1hdmFsW2ldW1sxXV0keCwgIHk9YXZhbFtpXVtbMV1dJHksIHo9YXZhbFtpXVtbMV1dJHosIHZpc2libGUgPSBhdmFsW2ldW1sxXV0kdmlzaWJsZSwgDQogICAgICAgICAgICAgICAgIG5hbWUgPSBhdmFsW2ldW1sxXV0kbmFtZSwgc2hvd2xlZ2VuZCA9IEZBTFNFKQ0KDQogIHN0ZXAgPC0gbGlzdChhcmdzID0gbGlzdCgndmlzaWJsZScsIHJlcChGQUxTRSwgbGVuZ3RoKGF2YWwpKSksDQogICAgICAgICAgICAgICBtZXRob2QgPSAncmVzdHlsZScpDQogIHN0ZXAkYXJnc1tbMl1dW2ldID0gVFJVRSAgDQogIHN0ZXBzW1tpXV0gPSBzdGVwIA0KfQ0KDQpwID0gcCAlPiUNCiAgbGF5b3V0KHNsaWRlcnMgPSBsaXN0KGxpc3QoYWN0aXZlID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudHZhbHVlID0gbGlzdChwcmVmaXggPSAiQTogIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBzID0gc3RlcHMpKSkNCnANCmBgYA0KDQojQ29uZGl0aW9uYWwgZGVwZW5kZW5jZQ0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpwbG90ZHMgPC0gZnVuY3Rpb24oZCwgcHRpdGxlLCBydGVxbil7DQogIHBsb3RkID0gYXMuZGF0YS5mcmFtZSh0KGQpKQ0KICBjb3JzID0gY29yKHBsb3RkKQ0KICBjb3JzID0gcm91bmQoY29ycywgZGlnaXRzID0gMikNCiAgI3Njb3JlIGNhbGN1bGF0aW9uDQogIGNsYXNzZiA9IE1jbHVzdChkWydCJyxdLCB2ZXJib3NlID0gRikkY2xhc3NpZmljYXRpb24NCiAgI2NhbGMgY29ycw0KICBjb3Jsb3dCID0gcm91bmQoY29yKHBsb3RkW2NsYXNzZiA9PSAxLCAxOjJdKVsxLCAyXSwgZGlnaXRzID0gMikNCiAgY29yaGlnaEIgPSByb3VuZChjb3IocGxvdGRbY2xhc3NmID09IDIsIDE6Ml0pWzEsIDJdLCBkaWdpdHMgPSAyKQ0KICBjbGFzc2ZbY2xhc3NmID09IDFdID0gcGFzdGUoJ2xvdyBCICgnLCBjb3Jsb3dCLCAnKScsIHNlcCA9ICcnKQ0KICBjbGFzc2ZbY2xhc3NmID09IDJdID0gcGFzdGUoJ2hpZ2ggQiAoJywgY29yaGlnaEIsICcpJywgc2VwID0gJycpDQogIHBsb3RkJEIgPSBjbGFzc2YNCiAgDQogIHAxID0gZ2dwbG90KHBsb3RkLCBhZXMoQSwgQykpICsgZ2VvbV9wb2ludCgpICsNCiAgICBzY2FsZV9jb2xvdXJfZGlzdGlsbGVyKHBhbGV0dGUgPSAnUmRQdScsIGRpcmVjdGlvbiA9IDEpICsNCiAgICBnZ3RpdGxlKHBhc3RlKHB0aXRsZSwgJyAoY29yID0gJywgY29yc1snQScsICdDJ10sICcpJywgc2VwID0gJycpKSArDQogICAgZmFjZXRfd3JhcCh+QikgKw0KICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgdGhlbWUoDQogICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91cj0iYmxhY2siKSwNCiAgICAgIHN0cmlwLmJhY2tncm91bmQ9ZWxlbWVudF9yZWN0KGNvbG91cj0iI2YwZjBmMCIsZmlsbD0iI2YwZjBmMCIpDQogICAgKQ0KICANCiAgI2FjdGl2YXRpb24gZnVuY3Rpb24gcGxvdHMNCiAgZiA9IGZ1bmN0aW9uKEEsIEIsIHJhdGVlcW4pIHsNCiAgICBDID0gMA0KICAgIGV2YWwocGFyc2UodGV4dCA9IHJhdGVlcW4pKQ0KICB9DQogIA0KICAjcGxvdCBhY3RpdmF0aW9uIGZ1bmN0aW9ucw0KICBwbG90ZCA9IGFzLmRhdGEuZnJhbWUodChkKSkNCiAgcGRhdGEgPSBleHBhbmQuZ3JpZCgnQScgPSBzZXEoMCwgMSwgbGVuZ3RoLm91dCA9IDEwMCksICdCJyA9IHNlcSgwLCAxLCBsZW5ndGgub3V0ID0gMTAwKSkNCiAgcGRhdGFbJ0FjdGl2YXRpb24nXSA9IGYocGRhdGEkQSwgcGRhdGEkQiwgcnRlcW4pDQogIHBsb3RkJEFjdGl2YXRpb24gPSAxDQogIA0KICBwMiA9IGdncGxvdChwZGF0YSwgYWVzKEEsIEIsIGZpbGwgPSBBY3RpdmF0aW9uKSkgKw0KICAgIGdlb21fcmFzdGVyKCkgKw0KICAgIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAnWWxPclJkJywgZGlyZWN0aW9uID0gMSkgKw0KICAgIGdndGl0bGUoJzEgYWN0IDEgaW5oaWIgZGVwZW5kZW50JykgKw0KICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgdGhlbWUoDQogICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJw0KICAgICkgKw0KICAgIGdlb21fcG9pbnQoZGF0YSA9IHBsb3RkLCBhZXMoQSwgQiksIGNvbG91ciA9ICd3aGl0ZScsIGFscGhhID0gMC4yLCBzaXplID0gMikNCiAgDQogIG11bHRpcGxvdChwMSwgcDIsIGNvbHMgPSAyKQ0KfQ0KDQpzaW1zZWVkID0gMzYwDQpuc2FtcCA9IDEwMA0KYGBgDQoNCklucHV0IG1vZGVscyBzZXR0aW5nDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNpbnB1dCBwYW5lbA0KaW5wdXRwYW5lbCgNCiAgc2VsZWN0SW5wdXQoJ2IxbWVhbicsIGxhYmVsID0gJ01lYW4gb2YgbWl4dHVyZSAxIG9mIEI6JywNCiAgICAgICAgICAgICAgY2hvaWNlcyA9IGMoMC4yLCAwLjQsIDAuNSksIHNlbGVjdGVkID0gMC4yKQ0KICBzZWxlY3RJbnB1dCgnYjJtZWFuJywgbGFiZWwgPSAnTWVhbiBvZiBtaXh0dXJlIDIgb2YgQjonLA0KICAgICAgICAgICAgICBjaG9pY2VzID0gYygwLjgsIDAuNiwgMC41KSwgc2VsZWN0ZWQgPSAwLjIpDQopDQoNCmcgPSBuZXcoJ0dyYXBoR1JOJykNCmZvciAobiBpbiBjKCdCJywgJ0EnICwnQycpKSB7DQogIGcgPSBhZGROb2RlKGcsIG4pDQp9DQpnID0gYWRkRWRnZShnLCAnQicsICdDJywgYWN0aXZhdGlvbiA9IFQpDQpnID0gYWRkRWRnZShnLCAnQScsICdDJywgYWN0aXZhdGlvbiA9IFQpDQoNCnNpbSA9IG5ldygnU2ltdWxhdGlvbkdSTicsIGdyYXBoID0gZywgc2VlZCA9IHNpbXNlZWQpDQppbnB1dE1vZGVscyA9IHNpbSRpbnB1dE1vZGVscw0KDQpyZW5kZXJQbG90KHsNCiAgI21vZGVsIG1vZGlmaWNhdGlvbg0KICBpbnB1dE1vZGVscyRCJG1lYW4gPSBjKGJsbWVhbiwgYjJtZWFuKQ0KICBpbnB1dE1vZGVscyRBJG1lYW4gPSAwLjUNCiAgaW5wdXRNb2RlbHMkQSRzZCA9IDAuMTUNCiAgaW5wdXRNb2RlbHMkQiRzZCA9IGMoMC4wNSwgMC4wNSkNCiAgc2ltJGlucHV0TW9kZWxzID0gaW5wdXRNb2RlbHMNCiAgDQogICNwbG90IGRlbnNpdGllcyBvZiBpbnB1dHMNCiAgc2V0LnNlZWQoc2ltc2VlZCkNCiAgIyBleHRpbnB1dHMgPSBtYXRyaXgocnVuaWYobnNhbXAgKiAyKSwgbmNvbCA9IDIpDQogICMgY29sbmFtZXMoZXh0aW5wdXRzKSA9IGMoJ0EnLCAnQicpDQogIGV4dGlucHV0cyA9IE5VTEwNCiAgZCA9IHNpbXVsYXRlRGF0YXNldChzaW0sIG5zYW1wLCBleHRpbnB1dHMpDQogIA0KICBwbG90ZCA9IGFzLmRhdGEuZnJhbWUodChkKSkNCiAgY29ycyA9IGNvcihwbG90ZCkNCiAgY29ycyA9IHJvdW5kKGNvcnMsIGRpZ2l0cyA9IDIpDQogIA0KICBoaXN0ZCA9IGRhdGEuZnJhbWUoJ0V4cHInID0gYyhwbG90ZCRBLCBwbG90ZCRCKSwgJ0dlbmUnID0gcmVwKGMoJ0EnLCAnQicpLCBlYWNoID0gbnJvdyhwbG90ZCkpKQ0KICBnZ3Bsb3QoaGlzdGQsIGFlcyhFeHByLCBmaWxsID0gR2VuZSkpICsgZ2VvbV9oaXN0b2dyYW0oYWxwaGEgPSAwLjcsIHBvc2l0aW9uID0gJ2lkZW50aXR5JykgKw0KICBnZ3RpdGxlKHBhc3RlKCdJbnB1dCBkYXRhJywgJyAoY29yID0gJywgY29yc1snQScsICdCJ10sICcpJywgc2VwID0gJycpKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQ0KICAgICkNCiAgDQogICMyIGFjdGl2YXRvcnMgT1INCiAgZyA9IG5ldygnR3JhcGhHUk4nKQ0KICBmb3IgKG4gaW4gTEVUVEVSU1sxOjNdKSB7DQogICAgZyA9IGFkZE5vZGUoZywgbikNCiAgfQ0KICBnID0gYWRkRWRnZShnLCAnQScsICdDJywgYWN0aXZhdGlvbiA9IFQpDQogIGcgPSBhZGRFZGdlKGcsICdCJywgJ0MnLCBhY3RpdmF0aW9uID0gVCkNCiAgc2ltID0gbmV3KCdTaW11bGF0aW9uR1JOJywgZ3JhcGggPSBnLCBzZWVkID0gc2ltc2VlZCkNCiAgc2ltJGlucHV0TW9kZWxzID0gaW5wdXRNb2RlbHMNCiAgZCA9IHNpbXVsYXRlRGF0YXNldChzaW0sIG5zYW1wKQ0KICBwbG90ZHMoZCwgJ0EgT1IgQicsIGdlbmVyYXRlUmF0ZUVxbihnZXROb2RlKGcsICdDJyksIGcpKQ0KICANCiAgIzIgcmVwcmVzc29ycyBPUg0KICBnID0gbmV3KCdHcmFwaEdSTicpDQogIGZvciAobiBpbiBMRVRURVJTWzE6M10pIHsNCiAgICBnID0gYWRkTm9kZShnLCBuKQ0KICB9DQogIGcgPSBhZGRFZGdlKGcsICdBJywgJ0MnLCBhY3RpdmF0aW9uID0gRikNCiAgZyA9IGFkZEVkZ2UoZywgJ0InLCAnQycsIGFjdGl2YXRpb24gPSBGKQ0KICBzaW0gPSBuZXcoJ1NpbXVsYXRpb25HUk4nLCBncmFwaCA9IGcsIHNlZWQgPSBzaW1zZWVkKQ0KICBzaW0kaW5wdXRNb2RlbHMgPSBpbnB1dE1vZGVscw0KICBkID0gc2ltdWxhdGVEYXRhc2V0KHNpbSwgbnNhbXApDQogIHBsb3RkcyhkLCAnIUEgT1IgIUInLCBnZW5lcmF0ZVJhdGVFcW4oZ2V0Tm9kZShnLCAnQycpLCBnKSkNCiAgDQogICMxIHJlcHJlc3NvciwgMSBBY3RpdmF0b3IgT1INCiAgZyA9IG5ldygnR3JhcGhHUk4nKQ0KICBmb3IgKG4gaW4gTEVUVEVSU1sxOjNdKSB7DQogICAgZyA9IGFkZE5vZGUoZywgbikNCiAgfQ0KICBnID0gYWRkRWRnZShnLCAnQScsICdDJywgYWN0aXZhdGlvbiA9IEYpDQogIGcgPSBhZGRFZGdlKGcsICdCJywgJ0MnLCBhY3RpdmF0aW9uID0gVCkNCiAgc2ltID0gbmV3KCdTaW11bGF0aW9uR1JOJywgZ3JhcGggPSBnLCBzZWVkID0gc2ltc2VlZCkNCiAgc2ltJGlucHV0TW9kZWxzID0gaW5wdXRNb2RlbHMNCiAgZCA9IHNpbXVsYXRlRGF0YXNldChzaW0sIG5zYW1wKQ0KICBwbG90ZHMoZCwgJyFBIE9SIEInLCBnZW5lcmF0ZVJhdGVFcW4oZ2V0Tm9kZShnLCAnQycpLCBnKSkNCiAgDQogICMyIGFjdGl2YXRvcnMgQU5EDQogIGcgPSBuZXcoJ0dyYXBoR1JOJykNCiAgZm9yIChuIGluIExFVFRFUlNbMTozXSkgew0KICAgIGcgPSBhZGROb2RlKGcsIG4pDQogIH0NCiAgZyA9IGFkZEVkZ2UoZywgYygnQScsICdCJyksICdDJywgYWN0aXZhdGlvbiA9IGMoVCwgVCksIGVkZ2V0eXBlID0gJ2FuZCcpDQogIHNpbSA9IG5ldygnU2ltdWxhdGlvbkdSTicsIGdyYXBoID0gZywgc2VlZCA9IHNpbXNlZWQpDQogIHNpbSRpbnB1dE1vZGVscyA9IGlucHV0TW9kZWxzDQogIGQgPSBzaW11bGF0ZURhdGFzZXQoc2ltLCBuc2FtcCkNCiAgcGxvdGRzKGQsICdBIEFORCBCJywgZ2VuZXJhdGVSYXRlRXFuKGdldE5vZGUoZywgJ0MnKSwgZykpDQogIA0KICAjMiByZXByZXNzb3JzIEFORA0KICBnID0gbmV3KCdHcmFwaEdSTicpDQogIGZvciAobiBpbiBMRVRURVJTWzE6M10pIHsNCiAgICBnID0gYWRkTm9kZShnLCBuKQ0KICB9DQogIGcgPSBhZGRFZGdlKGcsIGMoJ0EnLCAnQicpLCAnQycsIGFjdGl2YXRpb24gPSBjKEYsIEYpLCBlZGdldHlwZSA9ICdhbmQnKQ0KICBzaW0gPSBuZXcoJ1NpbXVsYXRpb25HUk4nLCBncmFwaCA9IGcsIHNlZWQgPSBzaW1zZWVkKQ0KICBzaW0kaW5wdXRNb2RlbHMgPSBpbnB1dE1vZGVscw0KICBkID0gc2ltdWxhdGVEYXRhc2V0KHNpbSwgbnNhbXApDQogIHBsb3RkcyhkLCAnIUEgQU5EICFCJywgZ2VuZXJhdGVSYXRlRXFuKGdldE5vZGUoZywgJ0MnKSwgZykpDQogIA0KICAjMSByZXByZXNzb3IsIDEgQWN0aXZhdG9yIEFORA0KICBnID0gbmV3KCdHcmFwaEdSTicpDQogIGZvciAobiBpbiBMRVRURVJTWzE6M10pIHsNCiAgICBnID0gYWRkTm9kZShnLCBuKQ0KICB9DQogIGcgPSBhZGRFZGdlKGcsIGMoJ0EnLCAnQicpLCAnQycsIGFjdGl2YXRpb24gPSBjKFQsIEYpLCBlZGdldHlwZSA9ICdhbmQnKQ0KICBzaW0gPSBuZXcoJ1NpbXVsYXRpb25HUk4nLCBncmFwaCA9IGcsIHNlZWQgPSBzaW1zZWVkKQ0KICBzaW0kaW5wdXRNb2RlbHMgPSBpbnB1dE1vZGVscw0KICBkID0gc2ltdWxhdGVEYXRhc2V0KHNpbSwgbnNhbXApDQogIHBsb3RkcyhkLCAnQSBBTkQgIUInLCBnZW5lcmF0ZVJhdGVFcW4oZ2V0Tm9kZShnLCAnQycpLCBnKSkNCn0pDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==